1 module mruby.proc;
2 
3 import mruby.mrb_class;
4 import mruby.object;
5 import mruby.value;
6 import mruby.khash;
7 import mruby;
8 
9 extern (C):
10 
11 alias kh_mt kh_mt_t;
12 
13 struct REnv
14 {
15 	enum mrb_vtype
16 	{
17 		MRB_TT_FALSE = 0,
18 		MRB_TT_FREE = 1,
19 		MRB_TT_TRUE = 2,
20 		MRB_TT_FIXNUM = 3,
21 		MRB_TT_SYMBOL = 4,
22 		MRB_TT_UNDEF = 5,
23 		MRB_TT_FLOAT = 6,
24 		MRB_TT_CPTR = 7,
25 		MRB_TT_OBJECT = 8,
26 		MRB_TT_CLASS = 9,
27 		MRB_TT_MODULE = 10,
28 		MRB_TT_ICLASS = 11,
29 		MRB_TT_SCLASS = 12,
30 		MRB_TT_PROC = 13,
31 		MRB_TT_ARRAY = 14,
32 		MRB_TT_HASH = 15,
33 		MRB_TT_STRING = 16,
34 		MRB_TT_RANGE = 17,
35 		MRB_TT_EXCEPTION = 18,
36 		MRB_TT_FILE = 19,
37 		MRB_TT_ENV = 20,
38 		MRB_TT_DATA = 21,
39 		MRB_TT_FIBER = 22,
40 		MRB_TT_MAXDEFINE = 23
41 	}
42 	mrb_vtype tt;
43 	uint color;
44 	uint flags;
45 	RClass* c;
46 	RBasic* gcnext;
47 	mrb_value* stack;
48 	mrb_sym mid;
49 	ptrdiff_t cioff;
50 }
51 
52 struct RProc
53 {
54 	enum mrb_vtype
55 	{
56 		MRB_TT_FALSE = 0,
57 		MRB_TT_FREE = 1,
58 		MRB_TT_TRUE = 2,
59 		MRB_TT_FIXNUM = 3,
60 		MRB_TT_SYMBOL = 4,
61 		MRB_TT_UNDEF = 5,
62 		MRB_TT_FLOAT = 6,
63 		MRB_TT_CPTR = 7,
64 		MRB_TT_OBJECT = 8,
65 		MRB_TT_CLASS = 9,
66 		MRB_TT_MODULE = 10,
67 		MRB_TT_ICLASS = 11,
68 		MRB_TT_SCLASS = 12,
69 		MRB_TT_PROC = 13,
70 		MRB_TT_ARRAY = 14,
71 		MRB_TT_HASH = 15,
72 		MRB_TT_STRING = 16,
73 		MRB_TT_RANGE = 17,
74 		MRB_TT_EXCEPTION = 18,
75 		MRB_TT_FILE = 19,
76 		MRB_TT_ENV = 20,
77 		MRB_TT_DATA = 21,
78 		MRB_TT_FIBER = 22,
79 		MRB_TT_MAXDEFINE = 23
80 	}
81 	mrb_vtype tt;
82 	uint color;
83 	uint flags;
84 	RClass* c;
85 	RBasic* gcnext;
86 	union
87 	{
88 		mrb_irep* irep;
89 		mrb_func_t func;
90 	}
91 	RClass* target_class;
92 	REnv* env;
93 }
94 
95 struct kh_mt
96 {
97 	khint_t n_buckets;
98 	khint_t size;
99 	khint_t n_occupied;
100 	ubyte* ed_flags;
101 	mrb_sym* keys;
102 	RProc** vals;
103 }
104 
105 RProc* mrb_proc_new (mrb_state*, mrb_irep*);
106 RProc* mrb_closure_new (mrb_state*, mrb_irep*);
107 RProc* mrb_proc_new_cfunc (mrb_state*, mrb_func_t);
108 RProc* mrb_closure_new_cfunc (mrb_state* mrb, mrb_func_t func, int nlocals);
109 void mrb_proc_copy (RProc* a, RProc* b);
110 mrb_value mrb_f_send (mrb_state* mrb, mrb_value self);
111 RProc* mrb_proc_new_cfunc_with_env (mrb_state*, mrb_func_t, mrb_int, const(mrb_value)*);
112 mrb_value mrb_proc_cfunc_env_get (mrb_state*, mrb_int);
113 void kh_alloc_mt (mrb_state* mrb, kh_mt_t* h);
114 kh_mt_t* kh_init_mt_size (mrb_state* mrb, khint_t size);
115 kh_mt_t* kh_init_mt (mrb_state* mrb);
116 void kh_destroy_mt (mrb_state* mrb, kh_mt_t* h);
117 void kh_clear_mt (mrb_state* mrb, kh_mt_t* h);
118 khint_t kh_get_mt (mrb_state* mrb, kh_mt_t* h, mrb_sym key);
119 khint_t kh_put_mt (mrb_state* mrb, kh_mt_t* h, mrb_sym key, int* ret);
120 void kh_resize_mt (mrb_state* mrb, kh_mt_t* h, khint_t new_n_buckets);
121 void kh_del_mt (mrb_state* mrb, kh_mt_t* h, khint_t x);
122 kh_mt_t* kh_copy_mt (mrb_state* mrb, kh_mt_t* h);